<?php
namespace app\controller;

use app\BaseController;
use think\facade\Request;
use think\facade\Db;
use think\Exception;

class Role extends BaseController
{
    //查询角色列表信息
    public function get_roleinfo()
    {
        $userId = $this->request->auth['data']->user->user_id;
        $current_page = Request::param('current_page');
        $page_size = Request::param('page_size');

        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');


        // 查询当前公司下的所有角色
        $nonRoles = Db::name('role')
            ->where('role_company_id', $companyId)
            ->order('role_id', 'desc') // 假设按id降序排列
            ->page($current_page, $page_size)
            ->select()->toArray();

        // 获取总数和总页数
        $total = Db::name('role')
            ->where('role_company_id', $companyId)
            ->count();
        $totalPages = ceil($total / $page_size);


        // 组装结果数据
        $result = [];
        foreach ($nonRoles as $role) {
            $result[] = [
                'role_id' => $role['role_id'],
                'role_name' => $role['role_name'],
                'role_remarks' => $role['role_remarks'],
                'role_switch' => $role['role_switch'],
                'role_creationtime' =>substr($role['role_creationtime'], 0, 10) ,
                'role_updatetime' => substr($role['role_updatetime'], 0, 10),

            ];
        }

        $data = [

            'data' => $result,
            'total' => $total,
            'totalPages' => $totalPages,

        ];
        // 返回结果，包含总数、总页数以及分页数据
        return json([

            'code' => 200,
            'msg' => 'Success',
            'data' => $data,
        ]);


    }
    //新增角色信息
    public function insert_roleinfo()
    {
        $data=Request::param('data');

        //用户的公司id
        $company_id = $this->request->auth['data']->user->user_company_id;

        // 验证参数
        if (!is_array($data)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        $data['role_switch']=1;
        $data['role_company_id']=$company_id;

        //验证数据库中角色名称是否重复
        if (Db::name('role')->where('role_name', $data['role_name'])->where('role_company_id', $company_id)->find()) {
            return json(['code' => -2, 'msg' => '角色名重复']);
        }


        try {
            // 开启事务
            Db::startTrans();

            // 插入 user 表
            Db::name('role')->insert($data);

            // 提交事务
            Db::commit();

            // 返回成功信息
            return json(['code'=>200,'msg'=>'插入成功']);

        } catch (Exception $e) {

            // 发生错误，回滚事务
            Db::rollback();
            return json(['msg' => 'Failed to inster role information: ' . $e->getMessage()], 500);

        }


    }

    //修改角色信息
    public function update_roleinfo()
    {
        $role_id = Request::param('id');
        $data=Request::param('data');

        //用户的公司id
        $company_id = $this->request->auth['data']->user->user_company_id;

        // 验证参数
        if (empty($role_id) || !is_array($data)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }

        //判断data是否包含role_switch字段
        if (!isset($data['role_switch'])) {
            //判断除了当前角色名称外，是否存在相同角色名称
            $role_info = Db::table('role')
                ->where('role_id', '<>', $role_id)
                ->where('role_name', $data['role_name'])
                ->where('role_company_id', $company_id)
                ->find();

            if ($role_info) {
                return json([
                    'code' => 400,
                    'msg' => '角色名称已存在',
                ]);
            }

        }

        try {
            // 开启事务
            Db::startTrans();

            // 更新 role 表
            Db::name('role')->where('role_id', $role_id)->update($data);

            // 提交事务
            Db::commit();

            // 返回成功信息
            return json(['code'=>200,'msg'=>'更新成功']);


        } catch (Exception $e) {

            // 发生错误，回滚事务
            Db::rollback();
            return json(['msg' => 'Failed to start transaction: ' . $e->getMessage()], 500);
        }




    }

    //删除角色信息
    public function delete_roleinfo()
    {
        $role_id = Request::param('id');

        if (empty($role_id)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        try {
            // 开启事务
            Db::startTrans();

            // 删除 role 表
            Db::name('role')->where('role_id', $role_id)->delete();

            // 提交事务
            Db::commit();

            // 返回成功信息
            return json(['code'=>200,'msg'=>'删除成功']);

        } catch (Exception $e) {

            // 发生错误，回滚事务
            Db::rollback();
            return json(['msg' => 'Failed to start transaction: ' . $e->getMessage()], 500);

        }



    }
    //获取所有权限和角色对应的权限
    public function get_rightinfo()
    {
        $role_id = Request::param('role_id');

        // 从数据库中获取数据，并将right_id改为id，right_name改为label
        $list = Db::name('right')->field('right_id,right_name,right_parent_id as parent_id')->select();

        // 构建树形结构
        $tree = $this->buildTree($list);

       $rights=Db::name('vw_role_right')->where('role_id', $role_id)->select();

       $arrayroleid=[];

       foreach ($rights as $right) {
           $arrayroleid[]=$right['right_id'];
       };

//       $data=[
//           'data'=>$tree,
//           'right'=>$arrayroleid,
//       ];





        // 将树形结构转换为JSON格式并输出
        return json(['code'=>200,'msg'=>'Success','data'=>$tree,'right'=>$arrayroleid]);

    }

    /**
     * 构建树形结构
     * @param array $list 数据库查询结果
     * @return array 树形结构
     */
    private function buildTree($list)
    {
        $tree = [];
        $map = [];

        // 创建一个映射数组，方便通过parent_id查找子节点
        foreach ($list as $item) {
            $map[$item['right_id']] = $item;
        }

        foreach ($list as $item) {
            // 如果存在parent_id，则将该节点添加到对应父节点的children数组中
            if (isset($map[$item['parent_id']])) {
                $map[$item['parent_id']]['child'][] = &$map[$item['right_id']];
            } else {
                // 如果没有parent_id，则作为根节点添加到树中
                $tree[] = &$map[$item['right_id']];
            }
        }

        return $tree;
    }


    //分配权限
    public function Update_SetRight()
    {
        $role_id = Request::param('role_id');
        $rightArr = Request::param('right');

        if (empty($role_id) || empty($rightArr)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }

        try {
            // 开启事务
            Db::startTrans();

            // 删除 role_right 表
            Db::name('role_right')->where('role_id', $role_id)->delete();

            // 插入 role_right 表
            foreach ($rightArr as $right_id) {
                Db::name('role_right')->insert(['role_id' => $role_id, 'right_id' => $right_id]);
            }

            // 提交事务
            Db::commit();

            // 返回成功信息
            return json(['code'=>200,'msg'=>'分配成功']);


        } catch (Exception $e) {

            // 发生错误，回滚事务
            Db::rollback();
            return json(['msg' => 'Failed to start transaction: ' . $e->getMessage()], 500);

        }





    }
}